package com.bgi.uims.module.sys.menu.action;

import java.util.List;

import javax.annotation.Resource;

import net.sf.json.JSONArray;

import org.apache.commons.lang.StringUtils;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.bgi.uims.common.action.BaseAction;
import com.bgi.uims.common.dto.PageVo;
import com.bgi.uims.module.sys.menu.dto.Menu;
import com.bgi.uims.module.sys.menu.service.MenuService;
import com.bgi.uims.module.sys.role.dto.SysRoles;
import com.bgi.uims.module.sys.user.dto.User;
import com.bgi.uims.pub.utils.Constant;
import com.bgi.uims.pub.utils.PublicMethod;


/**
 * ClassName:MenusAction <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2014-10-24 下午01:26:53 <br/>
 * @author   WEN
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
@Controller
@Scope("prototype")
public class MenuAction extends BaseAction{

	
	/**
	 * serialVersionUID:TODO(用一句话描述这个变量表示什么).
	 * @since JDK 1.7
	 */
	private static final long serialVersionUID = 1L;
	
	private PageVo pageVo;

	@Resource
	private MenuService menuService;
	private Menu menu;
	private SysRoles role;
	private com.bgi.uims.module.sys.menu.dto.Resource resource;
	
	public PageVo getPageVo() {
		return pageVo;
	}

	public void setPageVo(PageVo pageVo) {
		this.pageVo = pageVo;
	}
	
	public Menu getMenu() {
		return menu;
	}

	public void setMenu(Menu menu) {
		this.menu = menu;
	}

	public com.bgi.uims.module.sys.menu.dto.Resource getResource() {
		return resource;
	}

	public void setResource(com.bgi.uims.module.sys.menu.dto.Resource resource) {
		this.resource = resource;
	}
	public SysRoles getRole() {
		return role;
	}

	public void setRole(SysRoles role) {
		this.role = role;
	}

	
	/**
	 * 
	 * @Description：  //根据用户加载菜单
	 * @author: WEN
	 * @CreateDate:2015年3月30日 下午3:38:50
	 * @version: V1.0
	 */
	@SuppressWarnings("rawtypes")
	public String buildMenus(){
		User user = (User) session.get(Constant.LOGINUSER);
		if(user == null){
			pageVo = new PageVo();
			pageVo.setMsg("用户为空！");
			pageVo.setSuccess(false);
			return SUCCESS;
		}
		String menus="";
		pageVo=new PageVo();
		List list=menuService.buildMenus(user);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,user, null));
		//返回前端
		checkMenuText(list);
		JSONArray jsonArray2 = JSONArray.fromObject(list.toArray());
		menus="{\"children\":"+jsonArray2.toString()+"}";
		pageVo.setMsg(menus);
		pageVo.setSuccess(true);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  递归将菜单的父子关系体现出来
	 * @author: WEN
	 * @CreateDate:2015年3月30日 下午3:39:06
	 * @version: V1.0
	 */
	@SuppressWarnings({"rawtypes" })
	private void checkMenuText(List list)
	{
		if(list!=null&&list.size()>0)
		{
			for(int i=0;i<list.size();i++)
			{
				Menu tmenu=(Menu) list.get(i);
				convertMenuText(tmenu);
				checkMenuText(tmenu.getChildren());
			}
		}
	}
	/**
	 * 
	 * @Description：  
	 * @author: WEN
	 * @CreateDate:2015年3月30日 下午3:39:32
	 * @version: V1.0
	 */
	private void convertMenuText(Menu menu)
	{
		if((menu.getChildren()==null||menu.getChildren().size()==0)&&menu.getUrl()!=null&&menu.getUrl().trim().length()>0)
		{
			menu.setText("<a ref='"+menu.getIconCls()+"' rel='"+menu.getUrl()+"'><span class=nav>"+menu.getText()+"</span></a>");
		}
	}
	
	/**
	 * 
	 * @Description： 菜单管理，加载所以菜单信息,如果有不希望出现的，id号放到excluedId
	 * @author: WEN
	 * @CreateDate:2015年3月25日 上午10:24:21
	 * @version: V1.0
	 */
	public String menusTree(){
		pageVo=new PageVo();
		if (menu == null ){
			menu = new Menu();
		} else {
			if(menu.getExcludeId() != null &&
					!"".equals(menu.getExcludeId())){
				menu.setExcludeIds(menu.getExcludeId().split("\\,"));
			}
		}
		pageVo=menuService.menusTree(menu);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,menu, null));
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description： 角色菜单授权，加载角色授权信息及菜单
	 * @author: WEN
	 * @CreateDate:2015年3月25日 上午10:24:21
	 * @version: V1.0
	 */
	public String menusRoleTree(){
		pageVo=new PageVo();
		if (role == null ){
			role = new SysRoles();
		}
		pageVo=menuService.menusTree(role);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,role, null));
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  菜单管理，添加菜单
	 * @author: WEN
	 * @CreateDate:2015年3月25日 上午11:01:57
	 * @version: V1.0
	 */
	public String saveMenu(){
		boolean bool=false;
		pageVo=new PageVo();
		User sessionUser=(User) session.get(Constant.LOGINUSER);
		if(menu!=null && !StringUtils.isEmpty(menu.getMenuIndex()) 
				&& !StringUtils.isEmpty(menu.getText())
				&& !StringUtils.isEmpty(menu.getUrl()))
		{
			if (menu.getId() == null || "".equals(menu.getId())){
				menu.setLastModifiedUser(sessionUser.getRealName());
				
				bool=menuService.saveMenu(menu);
				if(!bool)
				{
					pageVo.setMsg(Constant.ERROR_CODE_101);
				} else {
					session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.INSERT,Constant.MENUMODULES , menu, null));
				}
			} else {
				Menu oldMenu = menuService.queryMenuById(menu);
				Menu parentMenu = new Menu();
				parentMenu.setId(oldMenu.getParentId());
				parentMenu = menuService.queryMenuById(parentMenu);
				if(parentMenu != null){
					oldMenu.setParentName(parentMenu.getText());
				}else {
					menu.setParentName(null);
				}
				menu.setCreateUser(sessionUser.getRealName());
				bool=menuService.saveMenu(menu);
				if(!bool)
				{
					pageVo.setMsg(Constant.ERROR_CODE_101);
				} else {
					session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.UPDATE,Constant.MENUMODULES , oldMenu, menu));
				}
			}
			
		}
		else
		{
			pageVo.setMsg(Constant.ERROR_CODE_102);
		}
		pageVo.setSuccess(bool);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  通过ID号查询菜单信息
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午12:37:36
	 * @version: V1.0
	 */
	public String queryMenuById(){
		pageVo=new PageVo();
		Menu resultMenu = menuService.queryMenuById(menu);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,menu, null));
		if(resultMenu.getParentId().trim().equals("menuRoot")){
			resultMenu.setParentId(resultMenu.getParentId().trim());
		}
		pageVo.setObject(resultMenu);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  删除菜单，需要判断是否还有资源，有的话，就不删除，返回错误信息
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午12:53:34
	 * @version: V1.0
	 */
	public String deleteMenu(){
		boolean bool=false;
		pageVo=new PageVo();
		if(menu!=null&&menu.getId()!=null)
		{
			Menu oldMenu = menuService.queryMenuById(menu);
			String msg = menuService.deleteMenu(menu);
			if(msg != null)
			{
				pageVo.setMsg(msg);
			} else {
				bool = true;
				session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.DELETE,Constant.MENUMODULES , oldMenu, null));
			}
		}
		else
		{
			pageVo.setMsg(Constant.ERROR_CODE_102);
		}
		pageVo.setSuccess(bool);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  查询资源
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午1:58:17
	 * @version: V1.0
	 */
	public String queryResource()
	{
		pageVo = new PageVo();
		if(menu == null){
			pageVo.setSuccess(true);
			return SUCCESS;
		}
		menu.getPage(this);
		pageVo=menuService.queryResource(menu);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,menu, null));
		pageVo.setSuccess(true);
		return SUCCESS;
	}
	/**
	 * 
	 * @Description： 添加或更新资源。
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午1:47:13
	 * @version: V1.0
	 */
	public String saveResource()
	{
		boolean bool=false;
		pageVo=new PageVo();
		User sessionUser=(User) session.get(Constant.LOGINUSER);
		if(resource!=null && !StringUtils.isEmpty(resource.getResourceName()) 
				&& !StringUtils.isEmpty(resource.getResourceUrl()))
		{
			if(resource.getResourceId() != null && 
					!"".equals(resource.getResourceId())){
				com.bgi.uims.module.sys.menu.dto.Resource oleResource = menuService.queryResourceById(resource);
				resource.setLastModifiedUser(sessionUser.getRealName());
				bool=menuService.addResource(resource);
				if(!bool)
				{
					pageVo.setMsg(Constant.ERROR_CODE_101);
				} else {
					session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.UPDATE,Constant.MENUMODULES , oleResource, resource));
				}
			} else {
				resource.setCreateUser(sessionUser.getRealName());
				bool=menuService.addResource(resource);
				if(!bool)
				{
					pageVo.setMsg(Constant.ERROR_CODE_101);
				} else {
					session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.INSERT,Constant.MENUMODULES , resource, null));
				}
			}
			
			
		}
		else
		{
			pageVo.setMsg(Constant.ERROR_CODE_102);
		}
		pageVo.setSuccess(bool);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  删除资源
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午1:50:09
	 * @version: V1.0
	 */
	public String deleteResource()
	{
		boolean bool=false;
		pageVo=new PageVo();
		if(resource != null && !StringUtils.isEmpty(resource.getResourceId()))
		{
			com.bgi.uims.module.sys.menu.dto.Resource oleResource = menuService.queryResourceById(resource);
			bool = menuService.deleteResource(resource);
			if(!bool)
			{
				pageVo.setMsg(Constant.ERROR_CODE_101);
			} else {
				session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.DELETE,Constant.MENUMODULES , oleResource, null));
			}
		}
		else
		{
			pageVo.setMsg(Constant.ERROR_CODE_102);
		}
		pageVo.setSuccess(bool);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：   通过ID号查询资源
	 * @author: WEN
	 * @CreateDate:2015年3月26日 下午5:05:07
	 * @version: V1.0
	 */
	public String queryResourceById(){
		if(resource == null){
			resource = new com.bgi.uims.module.sys.menu.dto.Resource();
		}
		pageVo=new PageVo();
		pageVo.setObject(menuService.queryResourceById(resource));
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,resource, null));
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description：  查询资源，根据选择的角色，和菜单   不分页
	 * @author: WEN
	 * @CreateDate:2015年3月26日 下午5:05:14
	 * @version: V1.0
	 */
	public String findRoleResource(){
		if(menu == null){
			menu = new Menu();
		}
		pageVo = menuService.findRoleResource(menu);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.SELECT,Constant.MENUMODULES,menu, null));
		pageVo.setSuccess(true);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description： 保存角色和菜单授权配置
	 * @author: WEN
	 * @CreateDate:2015年3月26日 下午5:05:14
	 * @version: V1.0
	 */
	public String saveAuthorizationMenu(){
		pageVo = new PageVo();
		if(menu == null){
			menu = new Menu();
		}
		String msg = menuService.saveAuthorizationMenu(menu);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.UPDATE,Constant.ROLEMODULES , menu, null));
		pageVo.setSuccess(true);
		pageVo.setMsg(msg);
		return SUCCESS;
	}
	
	/**
	 * 
	 * @Description： 保存角色和资源授权配置
	 * @author: WEN
	 * @CreateDate:2015年3月26日 下午5:05:14
	 * @version: V1.0
	 */
	public String saveAuthorizationResource(){
		pageVo = new PageVo();
		if(resource == null){
			resource = new com.bgi.uims.module.sys.menu.dto.Resource();
		}
		String msg = menuService.saveAuthorizationResource(resource);
		session.put(Constant.OPERATIONMSG, PublicMethod.operationMsg(Constant.UPDATE,Constant.ROLEMODULES , resource, null));
		pageVo.setSuccess(true);
		pageVo.setMsg(msg);
		return SUCCESS;
	}
	
}

